Computer software is generally created for interpreted language systems or compiled language systems. Interpreted language systems translate high-level program statements into executable form and execute one statement at a time rather than completely translating (i.e., compiling) the high-level statements before execution. Basic, LISP and APL are generally implemented as interpreted languages. Compiled language systems translate high-level program statements into an intermediate, object code, format prior to execution. In compiled language systems program statements are written in a source code programming language (e.g., C, C++). Source code contains human-readable program statements written in a high-level or assembly language that is not directly executable by a computer. The source code is processed by a compiler which transforms the source code into object code (e.g., .OBJ files) by following a set of syntactic and semantic rules. The object code is then linked together using a linker to produce an executable computer program (e.g., an .EXE file).
Executable computer programs can be very large in size, both as stored on disk and when loaded into computer memory. Dynamic link libraries (“DLL”) provide a mechanism to store executable routines and data separate from the main executable computer program. The executable routines can be loaded only when needed by the executable computer program. DLLs conserve space by only using memory when a routine or data is used. DLLs also provide for organization and management of computer code and data separate from the executable computer program and also separate from other DLLs. This allows a programmer to make corrections or improvements to only certain routines in a DLL without affecting the operation of the calling computer program or any other DLL. Additionally, DLLs can be shared among multiple computer programs. DLLs themselves can be quite large and multiple executable routines are often organized into a single module within the DLL, making the DLL not very granular in terms of its downloading, updating and loading.
Techniques exist for minimizing the transfer time associated with updating large DLLs or other code/data. File transfer protocols using a difference detection algorithm (e.g., rsync) can reduce transfer time. These algorithms can arrange source and target files into blocks of data, analyze the blocks, and only transfer the blocks that are not identical between the source and target files.
Compression can also be used to reduce transfer time of code and data both over communications media as well as from disk to memory. Embedded processor systems, which are especially sensitive to executable code size, have been implemented that implement compression for executable code. A compressed “wire” representation of code can be used, but the code must be decompressed before execution. Other techniques provide for direct execution of compressed code (e.g., “byte-coded RISC” or “BRISC” virtual machines).
The Curl™ language combines layout, scripting and programming capabilities in one integrated environment. By pairing this fully featured language with client side execution, Curl™ technology delivers fast, efficient, highly functional applications over the Web, and enables interactive Web services capabilities in which the client and server can interoperate. Curl™ content is displayed using a Web browser augmented with a Curl™ plug-in and a Curl™ runtime environment. The Curl™ runtime environment is atypical of many runtime environments in that it is compiled from approximately equal amounts of code and data. The Curl™ runtime environment is implemented using a large number of DLLs.